/*
 * Copyright @ 苏州瑞云信息技术有限公司 All rights reserved.
 */
package work.thread_eg.concurrent.blockingqueue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 *
 * 阻塞队列的基本使用
 * BlockingQueue是抽象类 可以实现生产者和消费者的场景
 * 线程安全的阻塞队列  底层是基于ReentrantLock和Condition实现的
 * 通过take()和put()阻塞方法实现线程的通信
 *
 *
 *
 * 实现类
 * ArrayBlockingQueue
 *
 *
 * @author Sakura Shen
 * @date 2021/9/26
 */
public class BlockingQueueTest {

    public static void main(String[] args) throws InterruptedException {

        // 定义阻塞队列
         int queueSize = 5;
         ArrayBlockingQueue<Integer> queue =
                new ArrayBlockingQueue<Integer>(queueSize);

         // take方法用来从队首取元素，如果队列为空，则等待；
        System.out.println("before take");
        queue.take();
        System.out.println("after take");

        System.out.println("before put");
        queue.put(1);
        queue.put(2);
        queue.put(3);
        queue.put(4);
        queue.put(5);
        System.out.println("put 5");
        // 　put方法用来向队尾存入元素，如果队列满，则等待；
        queue.put(6);
        System.out.println("put 6");
        System.out.println("after put");

    }
}
